SQL Server中自定义函数function的使用,今天通通都告诉你! 您所在的位置:网站首页 sql server计数函数 SQL Server中自定义函数function的使用,今天通通都告诉你!

SQL Server中自定义函数function的使用,今天通通都告诉你!

2024-06-17 22:05| 来源: 网络整理| 查看: 265

前言: 在SQL Server中不仅可以可以使用系统自带的函数(时间函数、聚合函数、字符串函数等),详情请见本人另一篇博文:SQL Server中的内置函数(超详细讲解),一次性全都掌握!,用户还可以根据需要自定义函数。与编程语法中的函数类似,Microsoft SQL Server用户定义函数接收参数、执行操作(如复杂运算)并将操作结果以值的形式进行返回。返回值可以是单个标量值或结果集。

文章目录 一、定义二、三种自定义函数的异同点三、函数参数四、举例说明五、修改和删除自定义函数六、注意事项

一、定义

用户自定义函数的类型:

标量值函数(返回一个标量值)

1)创建标量值函数:用户定义标量函数返回在returns子句中定义的类型的单个数据值。对于内联标量函数没有函数体;标量值是单个语句的结果。对于多语句标量函数,定义在begin···end块中的函数体包含一系列返回单个值的Transact-SQL语句。返回类型可以是除text、ntext、image、cursor和timestamp外的任何数据类型。在returns子句中定义返回值的数据类型,并且函数的最后一条语句必须为return语句。

3)调用标量值函数:可以在Transact-SQL语句中,调用返回标量值(与标量表达式的数据类型相同)的用户定义函数。必须使用至少由两部分组成名称的函数来调用标量值函数,即架构名.对象名。

表格值函数(内联表格值函数、多语句表值函数,返回一个结果集即返回多个值)

表格值函数就是返回table数据类型的用户定义函数,它分为内嵌表值函数和多语句表值函数。

1)内嵌表值函数:对于内嵌表值函数,没有函数主体;表是单个select语句的结果集。

2)多语句表值函数。 注:调用时可不需指定架构名。

二、三种自定义函数的异同点

1、相同点:

创建定义相同:

create function 函数名([传入的参数名称 传入参数的类型]) returns 返回值类型 as

2、不同点:

标量值函数返回的是一个数据类型值,内联表值函数返回的是一个table,而多语句表值函数返回的是一个table的变量(类似前面两个的结合);语法的结构:标量值函数和多语句表值函数都是要有begin···end,内联表值函数就没有;调用:标量函数要写成在dbo.函数名。 三、函数参数

参数可以是常量、表中的某个列、表达式或其他类型的值,在函数中有三种类型的参数。

输入:指必须输入一个值;可选值:在执行该参数时,可以选择不输入参数;默认值:函数中默认有值存在,调用时可以不指定该值。 四、举例说明 标量值函数定义格式: --创建函数 create function function_name(@parameter_name parameter_data_type) --create function 函数名称(@形参名 参数的数据类型) returns date_type --返回返回值的数据类型 [with encryption] --如果指定了 encryption 则函数被加密 as begin function_body --函数体(即 Transact-SQL 语句) return 表达式 end --调用函数 select 数据库名.所有者名.函数名(常量或@实参名)

例如:

--查询表记录 select * from student

在这里插入图片描述

--创建函数 use xsgl go create function Fun_name(@sname varchar(6)) returns varchar(6) as begin declare @result_name varchar(6) select @result_name = 姓名 from student where 学号 = @sname return @result_name end --调用函数 select xsgl.dbo.Fun_name('s1') name;

在这里插入图片描述

内联表格值函数定义格式: --创建函数 create function function_name(@parameter_name parameter_data_type) --create function 函数名称(@形参名 参数的数据类型) returns table --返回一张表 [with encryption] --如果指定了 encryption 则函数被加密 as return (一条SQL语句) --调用函数 select * from 数据库名.所有者名.函数名() --注意:调用时,可不指定数据库名、所有者名

特点:内联表格值函数支持在where子句中使用参数。

例如:

--创建函数 use xsgl go create function Fun_names(@sname varchar(6)) returns table as return select * from student where 姓名 = @sname --调用函数 select * from xsgl.dbo.Fun_names('辛国年') --select * from Fun_names('辛国年')

在这里插入图片描述

多语句表值函数定义格式: --创建函数 create function function_name(@parameter_name parameter_data_type) --create function 函数名称(@形参名 参数的数据类型) returns @Table_Variable_Name table(Column_1 culumn_type,Column_2 culumn_type) --returns @表变量 table 表的定义(即列的定义和约束) [with encryption] --如果指定了 encryption 则函数被加密 as begin 函数体(即Transact-SQL语句) return end --调用函数 select * from 数据库名.所有者名.函数名(常量或@实参名) --注意:调用时,可不指定数据库名、所有者名

多语句表值函数跟内联表值函数都是表值函数,它们返回的结果都是table类型。多语句表值函数通过多条语句来创建table类型的数据。这里不同于内联表值函数,内联表值函数的返回结果是由函数体内的select语句来决定。而多语句表值函数,则是需要指定具体的table类型的结构。也就是说返回的table已经定义好要哪些字段返回。所以它能够支持多条语句的执行来创建table数据。

例如:

--创建函数 use xsgl go create function Fun_nameall() returns @temp table(sName varchar(6),sAge int) as begin insert into @temp (sName,sAge) values ('张三',23) return end --调用函数 select * from xsgl.dbo.Fun_nameall() --select * from Fun_nameall()

在这里插入图片描述

五、修改和删除自定义函数 使用alter语句修改自定义函数: --格式: alter function 函数名(参数) returns table as return (一条SQL语句) 使用drop语句删除: drop function 函数名 六、注意事项

在编写自定义函数时我们需注意:

标量函数:

所有的入参前都必须加@;create后的返回,单词是returns,而不是return;returns后面的跟的不是变量,而是返回值的类型,如:int,char等;在begin/end语句块中,是return。

内联表格值函数:

只能返回table,所以returns后面一定是table;AS后没有begin/end,只有一个return语句来返回特定的记录。

多语句表值函数:

returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字table,最后是表的结构;在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回;最后只需要return,return后面不跟任何变量。

补充:

标量值函数,其本质上就是返回一个表达式,然后就可以在存储过程中调用了。对于标量值函数来说,调用时,需要指定数据库名、所有者名。如果不指定,那么SQL会不认识这个函数。表格值函数(内联表格值函数、多语句表值函数),调用时可不需指定数据库名、所有者名。因为其返回的表是单个select语句的结果集。内联表值型函数以表的形式返回一个返回值,即它返回的是一个表。内联表值型函数没有由begin-end语句括起来的函数体。其返回的表是由一个位于return子句中的select命令从数据库中筛选出来。内联表值型函数功能相当于一个参数化的视图。多语句表值函数可以看作标量函数和内联表值函数的结合体。它的返回值是一个表,但它和标量型函数一样有一个用begin-end语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。由此可见,它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值函数的不足。SQL存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在编写SQL函数的时候可能会发现,有些函数是在表值函数下写的、有些是在标量值下写的,区别是表值函数只能返回一个表,标量值函数可以返回基类型。


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有